home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / rpclib / xdr_mem.c < prev    next >
C/C++ Source or Header  |  1994-03-09  |  5KB  |  176 lines

  1. /*
  2.  * $Id: xdr_mem.c,v 1.2 1993/11/14 16:51:25 jraja Exp $
  3.  *
  4.  * $Log: xdr_mem.c,v $
  5.  * Revision 1.2  1993/11/14  16:51:25  jraja
  6.  * Fixed includes, ANSI prototypes.
  7.  *
  8.  */
  9. /* @(#)xdr_mem.c    2.1 88/07/29 4.0 RPCSRC */
  10. /*
  11.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  12.  * unrestricted use provided that this legend is included on all tape
  13.  * media and as a part of the software program in whole or part.  Users
  14.  * may copy or modify Sun RPC without charge, but are not authorized
  15.  * to license or distribute it to anyone else except as part of a product or
  16.  * program developed by the user.
  17.  * 
  18.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  19.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  20.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  21.  * 
  22.  * Sun RPC is provided with no support and without any obligation on the
  23.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  24.  * modification or enhancement.
  25.  * 
  26.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  27.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  28.  * OR ANY PART THEREOF.
  29.  * 
  30.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  31.  * or profits or other special, indirect and consequential damages, even if
  32.  * Sun has been advised of the possibility of such damages.
  33.  * 
  34.  * Sun Microsystems, Inc.
  35.  * 2550 Garcia Avenue
  36.  * Mountain View, California  94043
  37.  */
  38. #if !defined(lint) && defined(SCCSIDS)
  39. static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
  40. #endif
  41.  
  42. /*
  43.  * xdr_mem.h, XDR implementation using memory buffers.
  44.  *
  45.  * Copyright (C) 1984, Sun Microsystems, Inc.
  46.  *
  47.  * If you have some data to be interpreted as external data representation
  48.  * or to be converted to external data representation in a memory buffer,
  49.  * then this is the package for you.
  50.  *
  51.  */
  52.  
  53. #include <sys/param.h>
  54. #include <rpc/types.h>
  55. #include <rpc/xdr.h>
  56. #include <netinet/in.h>
  57.  
  58. static bool_t    xdrmem_getlong(XDR * xdrs, long * lp);
  59. static bool_t    xdrmem_putlong(XDR * xdrs, long * lp);
  60. static bool_t    xdrmem_getbytes(XDR * xdrs, caddr_t addr, u_int len);
  61. static bool_t    xdrmem_putbytes(XDR * xdrs, caddr_t addr, u_int len);
  62. static u_int    xdrmem_getpos(XDR * xdrs);
  63. static bool_t    xdrmem_setpos(XDR * xdrs, u_int pos);
  64. static long *    xdrmem_inline(XDR * xdrs, u_int len);
  65. static void    xdrmem_destroy(XDR * xdrs);
  66.  
  67. static struct    xdr_ops xdrmem_ops = {
  68.     xdrmem_getlong,
  69.     xdrmem_putlong,
  70.     xdrmem_getbytes,
  71.     xdrmem_putbytes,
  72.     xdrmem_getpos,
  73.     xdrmem_setpos,
  74.     xdrmem_inline,
  75.     xdrmem_destroy
  76. };
  77.  
  78. /*
  79.  * The procedure xdrmem_create initializes a stream descriptor for a
  80.  * memory buffer.  
  81.  */
  82. void
  83. xdrmem_create(xdrs, addr, size, op)
  84.     register XDR *xdrs;
  85.     caddr_t addr;
  86.     u_int size;
  87.     enum xdr_op op;
  88. {
  89.  
  90.     xdrs->x_op = op;
  91.     xdrs->x_ops = &xdrmem_ops;
  92.     xdrs->x_private = xdrs->x_base = addr;
  93.     xdrs->x_handy = size;
  94. }
  95.  
  96. static void
  97. xdrmem_destroy(XDR *xdrs)
  98. {
  99. }
  100.  
  101. static bool_t
  102. xdrmem_getlong(register XDR *xdrs, long *lp)
  103. {
  104.  
  105.     if ((xdrs->x_handy -= sizeof(long)) < 0)
  106.         return (FALSE);
  107.     *lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private))));
  108.     xdrs->x_private += sizeof(long);
  109.     return (TRUE);
  110. }
  111.  
  112. static bool_t
  113. xdrmem_putlong(register XDR *xdrs, long *lp)
  114. {
  115.  
  116.     if ((xdrs->x_handy -= sizeof(long)) < 0)
  117.         return (FALSE);
  118.     *(long *)xdrs->x_private = (long)htonl((u_long)(*lp));
  119.     xdrs->x_private += sizeof(long);
  120.     return (TRUE);
  121. }
  122.  
  123. static bool_t
  124. xdrmem_getbytes(register XDR *xdrs, caddr_t addr, register u_int len)
  125. {
  126.  
  127.     if ((xdrs->x_handy -= len) < 0)
  128.         return (FALSE);
  129.     bcopy(xdrs->x_private, addr, len);
  130.     xdrs->x_private += len;
  131.     return (TRUE);
  132. }
  133.  
  134. static bool_t
  135. xdrmem_putbytes(register XDR *xdrs, caddr_t addr, register u_int len)
  136. {
  137.  
  138.     if ((xdrs->x_handy -= len) < 0)
  139.         return (FALSE);
  140.     bcopy(addr, xdrs->x_private, len);
  141.     xdrs->x_private += len;
  142.     return (TRUE);
  143. }
  144.  
  145. static u_int
  146. xdrmem_getpos(register XDR *xdrs)
  147. {
  148.     return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
  149. }
  150.  
  151. static bool_t
  152. xdrmem_setpos(register XDR *xdrs, u_int pos)
  153. {
  154.     register caddr_t newaddr = xdrs->x_base + pos;
  155.     register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
  156.  
  157.     if ((long)newaddr > (long)lastaddr)
  158.         return (FALSE);
  159.     xdrs->x_private = newaddr;
  160.     xdrs->x_handy = (int)lastaddr - (int)newaddr;
  161.     return (TRUE);
  162. }
  163.  
  164. static long *
  165. xdrmem_inline(register XDR *xdrs, u_int len)
  166. {
  167.     long *buf = 0;
  168.  
  169.     if (xdrs->x_handy >= len) {
  170.         xdrs->x_handy -= len;
  171.         buf = (long *) xdrs->x_private;
  172.         xdrs->x_private += len;
  173.     }
  174.     return (buf);
  175. }
  176.